本文共 3418 字,大约阅读时间需要 11 分钟。
1)使能GPIO端口时钟;
2)初始化GPIO目标引脚为推挽输出模式 3)控制GPIO引脚输出高低,电平。#ifndef T_LED_H_#define T_LED_H_#include "stm32f10x.h"//R-红色#define LED1_GPIO_PORT GPIOB#define LED1_GPIO_CLK RCC_APB2Periph_GPIOB#define LED1_GPIO_PIN GPIO_Pin_5//G-绿色#define LED2_GPIO_PORT GPIOB#define LED2_GPIO_CLK RCC_APB2Periph_GPIOB#define LED2_GPIO_PIN GPIO_Pin_0//B-蓝色#define LED3_GPIO_PORT GPIOB#define LED3_GPIO_CLK RCC_APB2Periph_GPIOB#define LED3_GPIO_PIN GPIO_Pin_1
以上代码分别把控制LED灯的GPIO端口,GPIO引脚号以及GPIO端口时钟封装起来了。在实际控制的时候我们就可以直接使用这些宏,以达到应用代码与硬件无关的效果。
/*直接操作寄存器的方法控制IO*/#define digitalHi(p,i) {p->BSRR=i;}//输出高电平#define digitalLo(p,i) {p->BRR=i;}//输出低电平#define digitalToggle(p,i) {p->ODR^=i;}//输出反转状态/*定义控制IO的宏*/#define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)//红灯反转#define LED1_OFF digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN)//红灯灭#define LED1_ON digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN)//红灯亮#define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN)//绿灯反转#define LED2_OFF digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN)//绿灯灭#define LED2_ON digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN)//绿灯亮#define LED3_TOGGLE digitalToggle(LED3_GPIO_PORT,LED3_GPIO_PIN)//蓝灯反转#define LED3_OFF digitalHi(LED3_GPIO_PORT,LED3_GPIO_PIN)//蓝灯灭#define LED3_ON digitalLo(LED3_GPIO_PORT,LED3_GPIO_PIN)//蓝灯亮//红#define LED_RED LED1_ON;LED2_OFF;LED3_OFF //红#define LED_GREEN LED1_OFF;LED2_ON;LED3_OFF //绿#define LED_BLUE LED1_OFF;LED2_OFF;LED3_ON //蓝#define LED_YELLOW LED1_ON;LED2_ON;LED3_OFF //黄#define LED_PURPLE LED1_ON;LED2_OFF;LED3_ON //紫#define LED_CYAN LED1_OFF;LED2_ON;LED3_ON //青#define LED_WHITE LED1_ON;LED2_ON;LED3_ON //白#define LED_RGBOFF LED1_OFF;LED2_OFF;LED3_OFF //黑void LED_GPIO_Config(void);#endif /*T_LED_H_*/
#include "bsp_led.h"void LED_GPIO_Config(void){ //定义一个GPIO_InitTypeDef类型的结构体变量 GPIO_InitTypeDef GPIO_InitStructure; //开启LED相关的GPIO外设时钟 RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK | LED3_GPIO_CLK, ENABLE); //选择引脚模式为通用推挽输出 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置引脚速率为50MHz GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //选择要控制的GPIO引脚 GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN; //初始化GPIO端口 GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure); //初始化GPIO引脚 GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN; //初始化GPIO端口 GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure); //初始化GPIO引脚 GPIO_InitStructure.GPIO_Pin = LED3_GPIO_PIN; //初始化GPIO端口 GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure); //关灯 GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN); //关灯 GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN); //关灯 GPIO_SetBits(LED3_GPIO_PORT, LED3_GPIO_PIN);}
#include "stm32f10x.h"#include "bsp_led.h"#define SOFT_DELAY Delay(0x0FFFFF);void Delay(__IO u32 nCount); int main(void){ /*LED端口初始化*/ LED_GPIO_Config(); while (1) { LED1_ON; SOFT_DELAY; LED1_OFF; LED2_ON; SOFT_DELAY; LED2_OFF; LED3_ON; SOFT_DELAY; LED3_OFF; /*轮流显示,红绿蓝黄紫青白*/ LED_RED; SOFT_DELAY; LED_GREEN; SOFT_DELAY; LED_BLUE; SOFT_DELAY; LED_YELLOW; SOFT_DELAY; LED_PURPLE; SOFT_DELAY; LED_CYAN; SOFT_DELAY; LED_WHITE; SOFT_DELAY; LED_RGBOFF; SOFT_DELAY; }}void Delay(__IO uint32_t nCount) //延时函数{ for(; nCount != 0; nCount--);}
转载地址:http://zdpzz.baihongyu.com/